﻿Imports Microsoft.VisualBasic.FileIO
Imports CSLARecursos.Negocio.Editables

Namespace Modulos

    Module Module1

        ''' <summary>
        ''' Con la palabra clave WithEvents se especifica
        ''' que la variable declarada generará Eventos
        ''' </summary>
        Private WithEvents Cliente1 As Cliente

        ''' <summary>
        ''' Para capturar los eventos de una Clase que no especifica
        ''' la palabra clave WithEvents se usará AddHandler
        ''' </summary>
        Private Cliente2 As Cliente


        Sub Main()

            'NOTA: Comente el código que no se desea ejecutar

            'SentenciaDoWhile()
            'SentenciaDoUntil()
            'BucleFor()
            'BloqueSelectCase()
            'BloqueTry()
            TrabajarconClases()


        End Sub

        Private Sub SentenciaIF()
            Dim Valor As String = Console.ReadLine()

            If Valor = String.Empty Then
                Console.WriteLine("No se recibio ningun valor")
            Else
                Console.WriteLine("Hola {0} Como estas, que tengas un buen día", Valor)
            End If

            Console.ReadLine()
        End Sub

        Private Sub SentenciaDoWhile()
            Dim Valor As String = String.Empty

            While Valor = String.Empty
                Console.WriteLine("Escriba su nombre")
                Valor = Console.ReadLine()
            End While

            Console.WriteLine("Hola {0} Como estas, que tengas un buen día", Valor)

            Console.ReadLine()
        End Sub

        Private Sub SentenciaDoUntil()
            Dim Valor As String = String.Empty

            Do Until (Valor <> String.Empty)
                Console.WriteLine("Escriba su nombre")
                Valor = Console.ReadLine()
            Loop

            Console.WriteLine("Hola {0} Como estas, que tengas un buen día", Valor)

            Console.ReadLine()
        End Sub

        Private Sub BucleFor()
            'El bucle For nos permite repetir por un número determinado de veces
            'una sentencia
            Dim Valor As String = String.Empty

            Do Until (Valor <> String.Empty)
                Console.WriteLine("Escriba su nombre")
                Valor = Console.ReadLine()
            Loop

            Dim contador = 0

            For contador = 1 To 10 Step 1
                Console.WriteLine("Hola {0} Como estas, que tengas un buen día. El valor es {1}", Valor, contador)
            Next

            Console.WriteLine("El valor final de Contador es: {0}", contador)

            Console.WriteLine("Intentaremos dividir un valor entre 0")
            Console.ReadLine()

            Try
                Dim Dividendo = 0
                Dim Division = 50 \ Dividendo '<----Esto provocará que no se pueda seguir ejecutando la aplicación
                'Para controlar el error se debe usar el bloque Try
                Console.WriteLine("El resultado de la división es {0}", Division)

            Catch ex As Exception
                Console.WriteLine("Division entre cero")

            End Try



            Console.ReadLine()

        End Sub

        Private Sub BloqueSelectCase()
            'La sentencia Select Case nos ayuda a decidir que acción realizaremos si 
            'un valor tiene dos o más valores para evaluar
            Console.WriteLine("Elija una opción para continuar")
            Console.WriteLine("--------------------------")
            Console.WriteLine("A. Voté por Humala ")
            Console.WriteLine("B. Voté por Keiko ")
            Console.WriteLine("C. Voté por PPK ")

            'Recuperamos lo que escriba el usuario
            Dim Resultado As String = Console.ReadLine()

            Select Case Resultado
                Case "A"
                    Console.WriteLine("Ahora es el electo Presidente")
                Case "B"
                    Console.WriteLine("Perdió por un pelo")
                Case "C"
                    Console.WriteLine("Casi pasa a la segunda vuelta")
                Case "D", "E", "F"
                    Console.WriteLine("Tu candidato ni siquiera alcanzó a PPK")
                Case Else 'En caso en que ningún valor coincida
                    Console.WriteLine("Dato Errado")
            End Select

            Console.ReadLine()

        End Sub

        Private Sub BloqueTry()
            'El Bloque Try nos permite capturar una excepción (Error) en caso
            'se detecte. Hay muchos tipos de excepciones que nos permiten
            'saber a que se refiere exactamente

            Try '(En español significa Intentar)
                Console.WriteLine("Uso del bloque Try")
                Console.WriteLine("Por favor ingrese un número del 1 al 10")
                Dim Resultado As String = Console.ReadLine()

                Dim numero = Convert.ToInt32(Resultado)

                If numero > 10 Then
                    Console.WriteLine("Escribiste un número mayor a 10")
                Else
                    If numero = 0 Then
                        Console.WriteLine("Escribiste 0")
                    Else
                        If numero < 1 Then
                            Console.WriteLine("Escribiste un numero negativo")
                        Else
                            Console.WriteLine("Tu opción fue: {0}", numero)
                        End If
                    End If
                End If

            Catch ex As FormatException
                'Excepción que nos permite saber si no se puede convertir una cadena en un número
                'Console.WriteLine(ex.Message) 'Imprimimos en pantalla el mensaje de error
                'El típico mensaje que nos aparecerá es "La cadena de entrada no tiene el formato correcto"
                Console.WriteLine("No ingresaste un numero")
            Catch ex As Exception
                'Captura cualquier excepción que se nos presente.
                Console.WriteLine(ex.Message) 'Imprimimos en pantalla el mensaje de error
            Finally
                'Este bloque siempre se ejecuta, exista error o no
                Console.WriteLine("Este mensaje esta en el bloque que siempre se ejecuta")
                Console.ReadLine()
            End Try

            'Para encontrar mas información acerca del bloque Try diríjase a:
            'http://msdn.microsoft.com/es-es/library/fk6t46tz(VS.80).aspx#Y1400
        End Sub

        Public Sub TryExample()
            Dim x As Integer = 5   ' Declare variables.
            Dim y As Integer = 0

            Try                    ' Set up structured error handling.
                x = x \ y          ' Cause a "Divide by Zero" error.
            Catch ex As Exception When y = 0        ' Catch the error.
                Beep()
                MsgBox("You tried to divide by 0.") ' Show an explanatory message.

            Finally
                Beep()             ' This line is executed no matter what.
            End Try
        End Sub

        Public Sub TrabajarconClases()

            Console.WriteLine("Uso de las Clases y sus eventos")

            Cliente1 = New Cliente("Carlos")
            Cliente1.Apellidos = "Medina"

            Cliente2 = New Cliente("Erick")
            'Asociamos el evento por código sin necesidad de WithEvents
            AddHandler Cliente2.CambiaPropiedadApellidos, AddressOf ManejadorEventoIndividual
            'Cambiamos la propiedad Apellidos
            Cliente2.Apellidos = "Velasco"

            ''Ya no será necesario imprimir estos valores
            'Console.WriteLine("Los valores de cliente1 es: {0}", Cliente1.ToString())
            'Console.WriteLine("Los valores de cliente2 es: {0}", Cliente2)

            Console.ReadLine()

        End Sub

        Public Sub ManejadorEventoIndividual(ByVal objeto As Cliente) Handles Cliente1.CambiaPropiedadApellidos
            Console.WriteLine("Se Cambió la propiedad Apellidos en la Clase {0}", objeto)
        End Sub

    End Module

End Namespace

